package com.cxz.study.ddd_project.infrastructure.service;

import com.cxz.study.ddd_project_parent_api.common.ResponseData;
import org.slf4j.Logger;

import java.util.function.Function;

/**
 * @className: BaseRelationService
 * @author: ocxz1
 * @date: 2025/1/1 下午4:53
 * @Version: 1.0
 * @description: anneng-ltc-change-v1.0 基本
 */
public interface IRelationService {

    /**
     * @return 返回LTC参数校验器
     */
    LtcValidator getLtcValidator();

    /**
     * @return 获取日志记录对象
     */
    Logger getLogger();

    /**
     * 参数校验
     */
    <T> boolean paramCheck(T t);


    /**
     * rpc服务远程调用，针对于返参是：com.sie.iot.common.bean.ResponseData，返参数据为空的情况
     *
     * @param t               入参
     * @param callFunc        远程调用函数
     * @param convertFunc     rpc服务入参转换
     * @param backConvertFunc rpc出参转换
     * @param <T>             入参类型
     * @param <V>             出参类型
     * @param <U>             rpc调用 入参类型
     * @param <W>             rpc调用 出参类型
     * @return 执行结果
     */
    <T, V, U, W> ResponseData<V> rpcCall(T t, Function<U, ResponseData<W>> callFunc, Function<T, U> convertFunc, Function<W, V> backConvertFunc);

    <T, V, U, W> ResponseData<V> rpcCallThrow(T t, Function<U, ResponseData<W>> callFunc, Function<T, U> convertFunc, Function<W, V> backConvertFunc);


    /**
     * rpc服务远程调用，返参数据为空的情况
     *
     * @param t           入参
     * @param callFunc    远程调用函数
     * @param convertFunc rpc服务入参转换
     * @param <T>         入参类型
     * @param <U>         rpc调用 入参类型
     * @param <W>         rpc调用 出参类型
     * @return 执行结果
     */
    <T, U, W> ResponseData<Void> rpcCall(T t, Function<U, ResponseData<W>> callFunc, Function<T, U> convertFunc);

    /**
     * rpc服务远程调用，返参数据为空的情况
     *
     * @param t           入参
     * @param callFunc    远程调用函数
     * @param convertFunc rpc服务入参转换
     * @param vClass      出参数据类型
     * @param <T>         入参类型
     * @param <V>         出参类型
     * @param <U>         rpc调用 入参类型
     * @param <W>         rpc调用 出参类型
     * @return 执行结果
     */
    <T, V, U, W> ResponseData<V> rpcCall(T t, Function<U, ResponseData<W>> callFunc, Function<T, U> convertFunc, Class<V> vClass);

    /**
     * rpc服务远程调用，针对于返参是Object类型
     *
     * @param t               入参
     * @param callFunc        远程调用函数
     * @param convertFunc     rpc服务入参转换
     * @param backConvertFunc rpc出参转换
     * @param <T>             入参类型
     * @param <V>             出参类型
     * @param <U>             rpc调用 入参类型
     * @param <W>             rpc调用 出参类型
     * @return 执行结果
     */
    <T, V, U, W> ResponseData<V> rpcCallObj(T t, Function<U, W> callFunc, Function<T, U> convertFunc, Function<W, V> backConvertFunc);

    <T, V> ResponseData<V> rpcCall(T t, Function<T, ResponseData<V>> callFunc);
}

    
    